package com.polonium.eclipserunner.core;

/** Integration idea - try of making AbstractTransactionalJUnitTests part of PoloniumTests
 * @author Marek Serwanski
 *
 */
public class TransactionalSpringDescriptionBuilder {
//	private Description classDescription;
//	private int testCounter = 0;
//	
//	public Description getClassDescription() {
//		return classDescription;
//	}
//	
//	/** Returns root description of selected index of test (from all tests description)
//	 * @param index
//	 * @return
//	 */
//	public Description getTestRootDescription(int index){
//		return classDescription.getChildren().get(index);
//	}
//	
//	/** Recognizes if detailed description schould be build. Try to read from: <br />
//	 * system property or annotation @DetailedDescription present
//	 */
//	public void getDetailedDescriptionType(TestClass testClass) {
//	    String property = System.getProperty(DETAILED_DESCRIPTION_PROP_NAME);
//	    if ((property != null) && !property.equals(Boolean.FALSE.toString())) {
//	      DETAILED_DESCRIPTION = true;
//	    }
//	    
//	    if(!testClass.getAnnotatedFieldValues(testClass, DetailedDescription.class, String.class).isEmpty()){
//	    	DETAILED_DESCRIPTION = true;
//	    }
//	 }
//	
//	/** creates full description of all test methods based on annotations Given, When, Then
//	 * @param testClass
//	 */
//	public void createDescription(TestClass testClass, List<FrameworkMethod> tests) {
//		classDescription = Description.createSuiteDescription(testClass.getName());
//		
//		for (FrameworkMethod test : tests) {
//			if(!isTestProperlyAnnotated(test)){
//				throw new AnnotationException(test.getName() + " is not properly annotaded with @Given @When @Then");
//			}
//			if(!DETAILED_DESCRIPTION) createOneDescriptionFromAnnotations(test);
//			else{
//				Description testDescription = Description.createSuiteDescription(test.getName());
//				classDescription.addChild(testDescription);
//				
//				testCounter++;
//				createDescriptionsFromAnnotations(testClass, test, testDescription);
//			}
//		}
//	}
//	
//	/** If test is annotated with all mandatory annotations */
//	public boolean isTestProperlyAnnotated(FrameworkMethod method) {
//		return (method.getAnnotation(Given.class) != null &&
//				method.getAnnotation(When.class)!= null &&
//				method.getAnnotation(Then.class) != null);
//	}
//	
//	private void createDescriptionsFromAnnotations(TestClass testClass, FrameworkMethod test, Description testDescription) {
//		String testNumber = getTestNumber();
//		
//		testDescription.addChild(Description.createTestDescription(testClass.getClass(), 
//				GIVEN_PREFIX + getGivenDescription(test) + testNumber));
//		testDescription.addChild(Description.createTestDescription(testClass.getClass(), 
//				WHEN_PREFIX + getWhenDescription(test) + testNumber));
//		testDescription.addChild(Description.createTestDescription(testClass.getClass(), 
//				THEN_PREFIX + getThenDescription(test) + testNumber));
//	}
//	
//	private void createOneDescriptionFromAnnotations(FrameworkMethod test) {
//		String descriptionValue = (
//				test.getName() + 
//				getTestNumber() +
//				GIVEN_PREFIX + getGivenDescription(test) + SEPARATOR +
//				WHEN_PREFIX + getWhenDescription(test) + SEPARATOR +
//				THEN_PREFIX + getThenDescription(test)
//			);
//		
//		Description testDescription = Description.createSuiteDescription(descriptionValue);
//		classDescription.addChild(testDescription);
//	}
//	
//	private String getTestNumber(){
//		return " {" + testCounter + "} ";
//	}
//	
//	private String getGivenDescription(FrameworkMethod test){
//		return test.getAnnotation(Given.class).value();
//	}
//	
//	private String getWhenDescription(FrameworkMethod test){
//		return test.getAnnotation(When.class).value();
//	}
//	
//	private String getThenDescription(FrameworkMethod test){
//		return test.getAnnotation(Then.class).value();
//	}
}
